/*!
 * \file CliquerGoloso.h
 *
 * \date Jan 31, 2014
 * \author correa
 */
#ifndef CLIQUERGOLOSO_H_
#define CLIQUERGOLOSO_H_

#include <Grafo.h>
#include <Cliquer.h>
#include <Lista.h>

class CliquerGoloso : public Cliquer
{
	const int			_n;
	const Grafo&		_grafo;
	VertexSet& 			_RR;
	Lista *	 			_suborden;

	struct ComparadorGrados_CliquerGoloso
	{
		Grafo const * _compgraph;
		bool operator() (int a, int b) { return _compgraph->vecinos(a).size() < _compgraph->vecinos(b).size(); }
	} _compGrados;

	struct ComparadorPesoDbl_CliquerGoloso
	{
		DoubleValueArray const * _comparray;
		bool operator() (int a, int b) { return (*_comparray)[b] < (*_comparray)[a]; }
	} _pesosDbl;

	struct ComparadorPesoInt_CliquerGoloso
	{
		IntValueArray const * _comparray;
		bool operator() (int a, int b) { return (*_comparray)[b] < (*_comparray)[a]; }
	} _pesosInt;

public:
	CliquerGoloso(const Grafo &g, const Grafo &ord, bool clqOrStab);
	~CliquerGoloso();
	int optimize(const VertexSet &subgrafo, ProjectableCliqueSet &clique, int cotaInferior=0,
			int cotaSuperior=INT_MAX, int tolerancia=0);
	int optimize(const IntValueArray& pesos, const VertexSet &subgrafo,
			ProjectableCliqueSet &clique,
			int cotaInferior=0, int cotaSuperior=INT_MAX, int tolerancia=0);
	double optimize(const DoubleValueArray& pesos, const VertexSet &subgrafo,
			ProjectableCliqueSet &clique, double cotaInferior=0.0, double cotaSuperior=DBL_MAX, double tolerancia=0.0);
};


#endif /* CLIQUERGOLOSO_H_ */
